﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Loader;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Zhaoxi.GrpcService
{
	public class Startup
	{
		// This method gets called by the runtime. Use this method to add services to the container.
		// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
		public void ConfigureServices(IServiceCollection services)
		{
			services.AddGrpc();
			//开启注册发现
			// 利用asp.ner core 原理，实现后台挂起一个宿主 iis
			services.AddSingleton<IHostedService, UpdateService>();
		}

		// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
		public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
		{
			Console.CancelKeyPress += Console_CancelKeyPress;
			AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;
			AssemblyLoadContext.Default.Unloading += Default_Unloading;
			if (env.IsDevelopment())
			{
				app.UseDeveloperExceptionPage();
			}

			app.UseRouting();

			app.UseEndpoints(endpoints =>
			{
				endpoints.MapGrpcService<GreeterService>();
				endpoints.MapGrpcService<CustomMathService>();

				endpoints.MapGet("/", async context =>
				{
					await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
				});
			});
		}

		private void Default_Unloading(AssemblyLoadContext obj)
		{
			RedisHelper.DeleteKey(); 
		}

		private void CurrentDomain_ProcessExit(object sender, EventArgs e)
		{
			RedisHelper.DeleteKey(); 
		}

		private void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
		{
			RedisHelper.DeleteKey();
		}

	}
}
